Elixir 是一個比較寬鬆的 Functional(函式) 語言,
他有 Functional 語言的好處,沒有物件、沒有類別,只有方法。也沒有嚴謹的 Functional 語言那樣限制東限制西,
我都這樣介紹,簡單粗暴好學好延伸。
不知道為什麼我對 function 翻譯成函式覺得渾身不對勁,雖然翻成方法可能有點不對,但看起來比較簡單,這系列就都用 "方法" 來稱 function
因為全部都是方法,簡單寫的話沒有太多抽象的概念,也很好懂,
我會建議寫的時候想像每個方法是生產線上的處理站,每一個步驟都是一個方法,一樣的東西進去會有一樣的結果
洋芋片流程圖
定義好的方法應該要可以這樣被使用
chips =
potato
|> peel()
|> slice()
|> fry()
|> season()
|> pack()
所有的方法都必須要被定義在模組裡面
我們可以用 defmodule
來定義模組,並在 do
與 end
裡寫模組內容
模組名稱全部都是大寫開頭
defmodule Greet do
# 模組內容
end
長的名字用大駝峰式命名法(upper camel case)
defmodule AnotherModuleWithALongName do
end
可用 .
來分層,常常用來跟資料夾同步
defmodule BlogWeb.Notes.Note do
end
方法使用 def
定義,接著 snake case 的方法名稱,並在 do
與 end
裡寫方法內容
defmodule Greet do
def say_hi do
"HI"
end
end
say_hi()
#=> "HI"
方法變數可以用 ()
加在方法後
defmodule Greet do
def say_hi(name) do
"HI #{name}"
end
def rectangle_area(width, height) do
width * height
end
end
say_hi("Coco")
#=> "HI Coco"
方法會自動回傳最後一行的結果
defmodule Greet do
def say_hi do
"foo"
"bar"
"HI"
end
end
Greet.say_hi()
#=> "HI"
|>
Pipe Operator 管線運算子pipe |>
是把左邊的東西當成第一個變數待帶給右邊的方法
以下兩個是一樣的
say_hi("Jimmy")
"Jimmy" |> say_hi()
早些提到的洋芋片生產線流程大量用了 pipe
chips =
potato
|> peel()
|> slice()
|> fry()
|> season()
|> pack()
如果沒有用的話要改寫成這樣 有點難看
chips = pack(season(fry(slice(peel(potato)))))
或是改寫成這樣 有點多餘
peeled = peel(potato)
sliced = slice(peeled)
fried = fry(sliced)
seasoned = season(fried)
chips = pack(seasoned)